typedef struct { double w; } e_data;	// struttura per il peso degli archi

void randomize(void);	// inizializza la randomizzazione
int randomf(int, int);	// restituisce un intero casuale compreso nel range descritto dai parametri (inclusi)

void itoa(int, char[]);	// converte l'int in stringa, salvandola nel puntatore delscritto al secondo parametro
void reverse(char[]);	// inverte la stringa sovrascrivendola

int exists_arc(glp_graph*, int, int);	// restituisce  1 se (i,j) è in G, 0 altrimenti

e_data* get_e_data(glp_arc*);	// restituisce un puntatore alla struttura e_data relativa all'arco in input
double get_arc_w(glp_arc*);	// restituisce il peso dell'arco in input
void set_arc_w(glp_arc*,double);// pone il peso dell'arco in input pari al double fornito

glp_graph* custom_create_graph(void);	// crea un grafo pesato sugli archi e restituisce il puntatore al grafo creato
void custom_erase_graph(glp_graph*);	// "azzera" un grafo pesato sugli archi
void custom_delete_graph(glp_graph*);	// libera l'area di memoria relativa ad un grafo

glp_graph* random_graph(int, int, int, int);	// crea un grafo casuale, connesso, diretto e senza cappi
							// il grafo creato avrà un numero di nodi compreso tra il primo ed il secondo parametro
							// ogni arco avrà un peso nell'intervallo tra il terzo ed il quarto parametro
							// per adesso (27/06/11 15:30) il peso è memorizzato come double ma è sempre un intero 

glp_graph* random_graph_v2(int, int, int, int);

int get_node_degree(glp_graph*,int); // ritorna il grado del nodo in input

// TODO una funzione che generi un grafo casuale con pesi double veri!

int custom_write_graph(glp_graph *, const  char*); // scrive su file il grafo fornito in input. Crea il file o sovrascrive
int custom_read_graph(glp_graph *, const char*);	// crea un grafo (primo parametro) a partire da file (secondo parametro)
int custom_write_sol(glp_graph *,glp_prob *, const  char*);	// scrive su file la soluzione fornita in input. Crea il file o sovrascrive

int apply_on_edges(int(*pfun)(glp_arc*), glp_graph*);	// applica la funzione puntata dal primo parametro su ogni arco del grafo in input
							// l'applicazione della funzione deve restituire 0
							// se la funzione restituisce un valore non zero l'applicazione si ferma

int get_number_of_arcs(glp_graph *); // restituisce il numero di archi del grafo
int get_number_of_nodes(glp_graph *); // restituitsce il numero di nodi del grago

glp_arc* arc_iterator(glp_graph*,int);	// restituisce ad ogni chiamata un arco del grafo, poi NULL
										// se il secondo parametro è 0, resetta l'iterazione
void generate_arc_name(glp_arc*,char*); //genera un nome per l'arco in input nella stringa fornita come secondo parametro
